package com.lin.filegraph.utils.parser.astvisitor;

import com.lin.filegraph.utils.parser.astutil.CompileUnit;
import com.lin.filegraph.utils.parser.node.JDirectoryNode;
import com.lin.filegraph.utils.parser.node.JFileNode;
import com.lin.filegraph.utils.parser.node.JPackageNode;
import com.lin.filegraph.utils.parser.node.JProjectNode;
import com.lin.filegraph.utils.parser.simpleast.SimpleASTHelper;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.PackageDeclaration;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * @description:
 * @author: linhuaixu
 * @time: 2023/5/18 14:03
 */

public class FileVisitor {

    // static ArrayList<PackageNode> alPackage = new ArrayList<PackageNode>();
    private JProjectNode root = null;

    public FileVisitor(JProjectNode root) {
        // TODO Auto-generated constructor stub
        this.root = root;
    }

    public void traverse() {
        // System.out.println("Traversing PackageVisitor...");
        List<CompileUnit> compileUnits = root.getAstFileASTRequestor().getCompileUnits();
        // int count = 0;
        List<JFileNode> defaultPkgFileNodes = new ArrayList<>();
        List<JPackageNode> pkgs = new ArrayList<>();
        for (CompileUnit compileUnit : compileUnits) {
            // System.out.println((++count) + " " + compileUnit.getFilePath());
            CompilationUnit compilationUnit = compileUnit.getCompilationUnit();
            String code = compilationUnit.toString();
            PackageDeclaration packageDeclaration = compilationUnit.getPackage();
            String strPkgName = null;// ����
            String strFilePath = compileUnit.getFilePath();// �ļ�·��
            File file = new File(strFilePath);
            String strPkgPath = file.getParent();// ����·��
            String strDirPath = null;// ����·��
            String strDirName = null;// ���Ĺ������·��
            String strProjectPath = root.getFilePath();

            if (packageDeclaration != null) {
                strPkgName = packageDeclaration.getName().toString();
            } else {
                strPkgName = "default package";
            }
            // if (strFilePath.equals(
            // "C:/Users/Administrator/workspace/EvolutionEvaluator4.1/src/com.sitech.cmap.reverse.analysis.app.ArcReverse.ArcSrc.cn/edu/seu/complexityevaluator/dao/QueryProjInfoDao.java"))
            // {
            // System.out.println(packageDeclaration.getName());
            // }
            // if (strPkgName.equals("default package")) {
            // System.out.println("default package:" + strFilePath);
            // // continue;
            // }

            // if (strPkgName.equals("default package")) {
            // JFileNode fileNode = new JFileNode(compileUnit.getFilePath(),
            // compileUnit.getCompilationUnit(),
            // compileUnit.getFileName());
            // defaultPkgFileNodes.add(fileNode);
            // } else {
            if (!strPkgName.equals("default package") && strPkgPath.contains("strPkgName.replace('.', '/')")) {
                strDirPath = strPkgPath.substring(0, strPkgPath.lastIndexOf(strPkgName.replace('.', '/')));
            } else {
                strDirPath = strPkgPath;
            }

            if (strDirPath.substring(0, strProjectPath.length()).equals(strProjectPath)) {
                strDirName = strDirPath.substring(strProjectPath.length());
            } else {
                strDirName = strDirPath;
            }

            JDirectoryNode dir = SimpleASTHelper.getDirByName(strDirName, root);
            if (dir == null) {
                // �����Ŀ¼�ڵ�֮ǰδ�������򴴽�DirectoryNode����������ΪProjectNode���ӽڵ�
                dir = new JDirectoryNode(strDirPath, strDirName);
                root.addChildNode(dir);
            }
            JPackageNode packageNode = SimpleASTHelper.getPkgByName(strPkgName, dir);
            if (packageNode == null) {
                packageNode = new JPackageNode(strPkgPath, strPkgName);
                dir.addChildNode(packageNode);
                // if (!strPkgName.equals("default package")) {
                root.getPkgNames().add(strPkgName);
                // }
            }
            JFileNode fileNode = new JFileNode(compileUnit.getFilePath(), compileUnit.getCompilationUnit(),
                    compileUnit.getFileName());
            packageNode.addChildNode(fileNode);
        }
    }
    // for (JFileNode defPkgFile : defaultPkgFileNodes) {
    // File file = new File(defPkgFile.getFilePath());
    // String strPkgPath = file.getParent();// ����·��
    // for (JPackageNode pkg : pkgs) {
    // if (strPkgPath.equals(pkg.getFilePath())) {
    // pkg.addChildNode(defPkgFile);
    // }
    // }
    // }
    // }
}

